import tkinter as tk
from tkinter import ttk
from checkin_handler import CheckinHandler
from history_viewer import HistoryViewer
from stats_goals import StatsGoals
from storage_manager import StorageManager


class MoodTrackerApp(tk.Tk):
    """主应用类，负责程序的整体控制和界面协调"""

    def __init__(self):
        """初始化应用程序"""
        # 调用父类(tk.Tk)的构造函数
        super().__init__()

        # 设置窗口标题、大小和可调整性
        self.title("每日心情与学习打卡器")
        self.geometry("800x600")
        self.resizable(True, True)  # 允许窗口调整大小

        # 初始化数据管理器，用于处理文件读写操作
        self.storage = StorageManager()

        # 从文件加载打卡记录和学习目标数据
        self.checkins = self.storage.load_all_checkins_from_file()
        self.goals = self.storage.load_goals_from_file()

        # 设置应用的主题颜色，用于界面美化
        self.colors = {
            "primary": "#C81522",
            "secondary": "#D80B8C",
            "accent": "#000000",
            "neutral": "#FF7300",
            "success": "#32A6F1",
            "warning": "#06D366",
            "danger": "#015900",
            "info": "#1E1F22"
        }

        # 配置界面样式，统一风格
        self.style = ttk.Style()
        self.style.configure("TButton", font=("Arial", 10), padding=5, foreground="black")
        self.style.configure("TLabel", font=("Arial", 10), foreground="black")
        self.style.configure("TFrame", background="#f0f0f0")
        self.style.configure("Header.TLabel", font=("Arial", 16, "bold"),
                             background=self.colors["primary"], foreground="white")
        self.style.configure("Subheader.TLabel", font=("Arial", 12, "bold"), background="#f0f0f0")

        # 初始化各个功能模块的处理器
        self.checkin_handler = CheckinHandler(self)  # 打卡功能处理器
        self.history_viewer = HistoryViewer(self)  # 历史记录查看器
        self.stats_goals = StatsGoals(self)  # 统计和目标管理处理器

        # 创建主界面
        self.create_main_frame()

    def create_main_frame(self):
        """创建应用的主界面，包含四个功能按钮"""
        # 清除当前窗口中的所有控件
        for widget in self.winfo_children():
            widget.destroy()

        # 创建主框架，使用padding增加内边距
        main_frame = ttk.Frame(self, padding=20)
        main_frame.pack(fill=tk.BOTH, expand=True)  # 填充整个窗口

        # 添加标题标签
        title_label = ttk.Label(main_frame, text="每日心情与学习打卡器", style="Header.TLabel")
        title_label.pack(pady=20)  # 垂直方向添加间距

        # 创建按钮框架，用于放置四个功能按钮
        button_frame = ttk.Frame(main_frame)
        button_frame.pack(fill=tk.BOTH, expand=True, pady=20)

        # 定义四个功能按钮的信息：文本、点击事件和颜色
        buttons = [
            ("今日打卡", self.show_checkin_form, self.colors["primary"]),
            ("历史记录", self.show_history_view, self.colors["info"]),
            ("心情统计", self.show_stats_view, self.colors["secondary"]),
            ("学习目标", self.show_goals_view, self.colors["accent"])
        ]

        # 使用网格布局创建2x2的按钮矩阵
        for i, (text, command, color) in enumerate(buttons):
            btn = ttk.Button(
                button_frame,
                text=text,
                command=command,  # 绑定按钮点击事件
                style="TButton"
            )
            # 使用grid布局放置按钮，形成2x2矩阵
            btn.grid(row=i // 2, column=i % 2, padx=20, pady=20, sticky="nsew")

            # 配置按钮的背景颜色
            self.style.configure(f"{i}.TButton", background=color)
            btn.configure(style=f"{i}.TButton")

        # 设置按钮框架的行和列权重，使按钮在窗口调整大小时均匀分布
        button_frame.grid_rowconfigure(0, weight=1)
        button_frame.grid_rowconfigure(1, weight=1)
        button_frame.grid_columnconfigure(0, weight=1)
        button_frame.grid_columnconfigure(1, weight=1)

    def show_checkin_form(self):
        """显示打卡表单界面"""
        self.checkin_handler.show_checkin_form()

    def show_history_view(self):
        """显示历史记录界面"""
        self.history_viewer.show_history_view()

    def show_stats_view(self):
        """显示心情统计界面"""
        self.stats_goals.show_stats_view()

    def show_goals_view(self):
        """显示学习目标管理界面"""
        self.stats_goals.show_goals_view()

    def run(self):
        """运行应用程序的主事件循环"""
        self.mainloop()


if __name__ == "__main__":
    # 创建应用实例并运行
    app = MoodTrackerApp()
    app.run()